<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>类</title>
</head>
<body>
<script>
 /*
 * 函数受函数作用域限制 不受块级作用域限制 但是类受块级作用域限制
 * */

 {

     function foo(){
         console.log('a')
     }
 }

 foo()

 /*
 * class的 constructor默认会返回this 但是我们也可以显示的返回其他的数据
 * */

 class Person{
     constructor() {
         return {
             name: "Alice",
             /*
             * 如果构造函数返回的是一个新的对象的话那么使用instanceof判断类型会返回 false
             * 除非我们修改了新对象身上的原型指向
             * */
             __proto__: Person.prototype
         }
     }
 }

 let person = new Person()
 console.log(person instanceof Person)

 /*
 * 类中的构造函数和一般的构造没有什么大的不同,都可以被单独进行调用
 * 但是类中的构造函数必须使用new进行调用 当然我们一般不会这样操作 因为new class就自动的调用了构造函数
 *
 * */

 console.log(new Person.prototype.constructor());
 let  p = new Person()
 console.log(new p.constructor());

 /*
 * 类本身在使用new调用的时候会被当成构造函数看待,此时class中的constructor不会被当成函数看待
 *
 *
 * */

 /*
 * 这里可以从class的角度来看待Person是person对象的构造函数
 * 也可以从函数的角度看待 person是在访问原型上的constructor属性,指向构造函数本身
 * */
 console.log(person.constructor === Person)

 let myPerson = new person.constructor();
 let myPerson1 = new Person.prototype.constructor()
 console.log(myPerson.constructor === Person)
 console.log(myPerson1.constructor === Person)

 /*
 * 这样写不是访问class中的构造器
 * */
 console.log(new Person.constructor())


</script>
</body>
</html>